package com.swh.cloud.biz.base.dao;

import java.lang.reflect.ParameterizedType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

/**
 * 所有dao的实现基类 ，所有dao必须继承自此类
 * @author sangwenhao-桑文豪
 * @date 2016年2月16日 下午6:28:03
 * @param <T>
 */
//注解 可以被继承，子类中的注解对父类中的方法无效
@Transactional
public class BaseDaoImpl<T> extends SqlSessionDaoSupport implements IBaseDao<T> {

	private Logger logger = LoggerFactory.getLogger(getClass()) ;
	
	private Class<T> clazz = null ;//
	
	private static String NAMESPACE ;
	
	@SuppressWarnings("unchecked")
	public BaseDaoImpl(String namespace) {
		BaseDaoImpl.NAMESPACE = namespace ;
		// 使用反射技术得到T的真实类型
		ParameterizedType pt = (ParameterizedType)this.getClass()
				.getGenericSuperclass();// 获取当前对象的泛型的父类类型
		// 获取第一个类型参数的真实类型
		this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
		logger.info("clazz-->" + clazz +"/n NAMESPACE:"+NAMESPACE);
	}
	
	@Override
	public boolean save(T entity) {
		boolean flag = true;
		try {
			getSqlSession().insert(NAMESPACE+".insert", entity);
		} catch (Exception e) {
			flag = false;
			logger.error(NAMESPACE+" 在进行保存数据时出现异常：",e);
			throw new RuntimeException(e.getMessage());
		}
		return flag;
	}

	@Override
	@Deprecated
	public boolean delete(Long id) {
		boolean flag = true;
		try {
			this.getSqlSession().delete(NAMESPACE+".deleteById", id);
		} catch (Exception e) {
			flag = false ;
			logger.error(NAMESPACE+" 在进行删除数据时出现异常：id:"+id+" ",e);
		}
		return flag;
	}
	
	@Override
	public boolean delete(String uuid) {
		boolean flag = true;
		try {
			this.getSqlSession().delete(NAMESPACE+".deleteByUUId", uuid);
		} catch (Exception e) {
			flag = false ;
			logger.error(NAMESPACE+" 在进行删除数据时出现异常：UUId:"+uuid+" ",e);
		}
		return flag;
	}

	@Override
	public boolean delete(T entity) {
		boolean flag = true;
		try {
			this.getSqlSession().delete(NAMESPACE+".deleteByEntity", entity);
		} catch (Exception e) {
			flag = false ;
			logger.error(NAMESPACE+" 在进行删除数据时出现异常：",e);
		}
		return flag;
	}
	
	@Override
	public int update(T entity) {
		int count = 0;
		try {
			this.getSqlSession().update(NAMESPACE+".updateByEntity", entity);
		} catch (Exception e) {
			count = 0 ;
			logger.error(NAMESPACE+" 在进行删除数据时出现异常：",e);
		}
		return count;
	}

	@SuppressWarnings("unchecked")
	@Override
	@Deprecated
	public T getById(Long id) {
		if (id == null) {
			return null;
		} else {
			return (T) this.getSqlSession().selectOne(NAMESPACE+".getById", id);
		}
	}
	
	/**
	 * 根据uuid查询对象
	 * @param uuid
	 * @return
	 * @author sangwenhao-桑文豪
	 * @date 2016年3月22日 下午10:02:35
	 */
	@Override
	public T getByUUId(String uuid) {
		if (StringUtils.isBlank(uuid)) {
			return null;
		} else {
			return (T) this.getSqlSession().selectOne(NAMESPACE+".getByUUId", uuid);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> getByIds(List<String> ids) {
		if (ids==null || ids.isEmpty()) {
			return null;
		} else {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("ids", ids);
			return (List<T>) getSqlSession().selectList(NAMESPACE+".getByIds", map);
		}
	}

	@Override
	public T queryByEntity(T entity) {
		List<T> lists = getSqlSession().selectList(NAMESPACE+".queryByEntity", entity) ;
		return lists.get(0);
	}

	@Override
	public List<T> queryInfosByEntity(T entity) {
		return getSqlSession().selectList(NAMESPACE+".queryInfosByEntity", entity);
	}

	@Override
	public List<T> queryInfosByEntity(T entity, int start, int limit) {
		List<T> lists = null ;
		try {
			if(limit == 0){//如果limit为0 则不进行分页
				queryInfosByEntity(entity);
			}else{
				if(start < 0){
					start = 0 ;
				}
				if(limit < start){
					limit = start ;
				}
				RowBounds rb = new RowBounds(start, limit);
				lists = getSqlSession().selectList(NAMESPACE+".queryInfosByEntity", entity, rb);
			}
			
		} catch (Exception e) {
			logger.error(NAMESPACE+" 在进行分页查询时出现异常：",e);
		}
		return lists ;
	}

	@Override
	public <T> T getT(T entity) {
	    List<T> lists = this.getSqlSession().selectList(NAMESPACE+".queryByEntity", entity);
	    if(CollectionUtils.isNotEmpty(lists)){
		return lists.get(0);
	    }
	    return null ;
	}

}
